package Array_and_String;

/*
编写一种算法，若M × N矩阵中某个元素为0，则将其所在的行与列清零。
示例 1：
输入：
[
  [1,1,1],
  [1,0,1],
  [1,1,1]
]
输出：
[
  [1,0,1],
  [0,0,0],
  [1,0,1]
]
示例 2：
输入：
[
  [0,1,2,0],
  [3,4,5,2],
  [1,3,1,5]
]
输出：
[
  [0,0,0,0],
  [0,4,5,0],
  [0,3,1,0]
]
作者：LeetCode
链接：https://leetcode.cn/leetbook/read/array-and-string/ciekh/
 */

import java.util.ArrayList;

public class _22零矩阵 {
    public static void main(String[] args) {

        int[][] n = {{0,1,2,0},{3,4,5,2},{1,3,1,5}};
        setZeroes(n);
        for (int[] ints : n) {
            for (int anInt : ints) {
                System.out.print(anInt);
            }
            System.out.println();
        }
    }

    public static void setZeroes(int[][] matrix) {
        //集合的add与集合的contain时间复杂度太高
        //效果不好

        //遍历集合记录所有元素0的坐标
        //创建i,j坐标集合
        ArrayList<Integer> iList = new ArrayList<Integer>();
        ArrayList<Integer> jList = new ArrayList<Integer>();
        //记录0元素坐标
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                if (matrix[i][j] == 0) {
                    iList.add(i);
                    jList.add(j);
                }
            }
        }

        //再次遍历集合根据坐标集合将所有符合要求的元素变成0
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                if(iList.contains(i) || jList.contains(j)){
                    matrix[i][j] = 0;
                }
            }
        }

    }

    //官解
    public void setZeroes2(int[][] matrix) {

        int m = matrix.length, n = matrix[0].length;
        boolean[] row = new boolean[m];
        boolean[] col = new boolean[n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    row[i] = col[j] = true;
                }
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (row[i] || col[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
}
